﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using BlogsAPI;
using VkontakteSharp;
using VkontakteSharp.Enums;
using VkontakteSharp.Model;

namespace VkontakteSharp.Endpoints.Places {
    public class Authenticated : VkontakteAPI
    {
        public Authenticated(VkontakteConfig config, string authInfo) : base(config, authInfo, "/places.") { }

        /// <summary>
        /// Возвращает список отметок пользователей в местах согласно заданным параметрам
        /// </summary>
        /// <param name="latitude">географическая широта исходной точки поиска, заданная в градусах (от -90 до 90).</param>
        /// <param name="longitude">географическая долгота исходной точки поиска, заданная в градусах (от -180 до 180).</param>
        /// <param name="count">количество возвращаемых отметок. Игнорируется, если установлен ненулевой timestamp.</param>
        /// <param name="sincetime">указывает, что нужно вернуть только те отметки, которые были созданы после заданного timestamp.</param>
        /// <returns></returns>
        /// <see cref="https://vk.com/dev/places.getCheckins"/>
        public Response<List<Checkin>> GetCheckins(double latitude, double longitude, int count = 100, DateTime? sincetime = null)
        {
            return (Response<List<Checkin>>)Mapper.Map<Response<List<Checkin>>>(GetCheckinsJson(latitude, longitude, count));
        }

        private string GetCheckinsJson(double latitude, double longitude, int count = 100, DateTime? sincetime = null)
        {
            if (count > 100)
            {
                throw new ArgumentOutOfRangeException("count", "Can't be more than 100");
            }
            string uri = string.Format(CultureInfo.GetCultureInfo("en-US"), base.Uri + "getCheckins?v=3.0&access_token={0}&latitude={1}&longitude={2}",
                AuthInfo,
                latitude, 
                longitude 
                );
            if (sincetime.HasValue)
            {
                uri += "&timestamp=" + Common.ConvertToUnixTimestamp(sincetime.Value);
            }
            else
            {
                uri += "&count=" + count;
            }
            return HttpClientOld.GET(uri);
        }

        /// <summary>
        /// Возвращает список мест, найденных по заданным условиям поиска.
        /// </summary>
        /// <param name="latitude">географическая широта исходной точки поиска, заданная в градусах (от -90 до 90).</param>
        /// <param name="longitude">географическая долгота исходной точки поиска, заданная в градусах (от -180 до 180).</param>
        /// <param name="count">количество мест, информацию о которых необходимо вернуть. положительное число, по умолчанию 30, максимальное значение 1000</param>
        /// <param name="radius">тип радиуса зоны поиска (от 1 до 4)</param>
        /// <returns></returns>
        /// <see cref="https://vk.com/dev/places.search"/>
        public Response<List<Place>> GetPlaces(double latitude, double longitude, int count = 30, int radius = 1)
        {
            return (Response<List<Place>>)Mapper.Map<Response<List<Place>>>(GetPlacesJson(latitude, longitude, count, radius));
        }

        private string GetPlacesJson(double latitude, double longitude, int count = 30, int radius = 1)
        {
            if (count > 1000)
            {
                throw new ArgumentOutOfRangeException("count", "Can't be more than 1000");
            }
            string uri = string.Format(CultureInfo.GetCultureInfo("en-US"), base.Uri + "search?v=3.0&access_token={0}&latitude={1}&longitude={2}&radius={3}",
                AuthInfo,
                latitude,
                longitude,
                radius
                );
            uri += "&count=" + count;
            return HttpClientOld.GET(uri);
        }

    }
}
